home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 37
/
Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso
/
Aminet
/
game
/
patch
/
jst32b_dev.lha
/
jst_dev
/
sources
/
src
/
DiskTools
/
rippsyfiles.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-03-31
|
4KB
|
208 lines
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <dos/dos.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <exec/execbase.h>
#include <exec/libraries.h>
#include <exec/memory.h>
#include <pragmas/dos_pragmas.h>
#include <string.h>
#define RAWTRACK_LEN 0x8000
#define TRACK_LEN 0x1800
#define START_TRACK 2
#define END_TRACK 159
#define NB_TRACKS END_TRACK-START_TRACK+1
extern struct ExecBase *SysBase;
extern APTR InitTrackDisk(ULONG);
extern void ShutTrackDisk(void);
extern ULONG CheckDiskIn (void);
extern ULONG ReadRawTrackIndex(ULONG,UBYTE *);
extern ULONG DecodeTrack(UBYTE *, UBYTE *);
extern ULONG WriteFiles(UBYTE *);
UBYTE *rawTrackBuffer=0L;
UBYTE *decTrackBuffer=0L;
char *charunit="DF0:";
int allocated=0,diskinit=0;
BPTR oldlock,newlock;
void CloseAll(char *mess)
{
if (mess) printf("** %s\n",mess);
if (diskinit) ShutTrackDisk();
if (allocated) Inhibit(charunit,FALSE);
if (rawTrackBuffer) FreeMem((APTR)rawTrackBuffer,RAWTRACK_LEN);
if (decTrackBuffer) FreeMem((APTR)decTrackBuffer,TRACK_LEN*NB_TRACKS);
if (newlock)
{
CurrentDir(oldlock);
UnLock(newlock);
}
exit(0);
}
void BreakHandle(int code)
{
CloseAll("User break");
}
main(unsigned int argc,char ** argv)
{
ULONG diskunit,numid,readid;
char strid[10];
int i,readok,retries,dcrslt;
char *trkptr;
printf("RipPsyFiles V2.1, the Psygnosis disk file ripper by Jean-François Fabre\n");
switch(argc)
{
case 0:
case 1:
case 2:
printf("Usage : rippsyfiles <unit number> <destination-dir> [<diskid>]\n");
if (!argc) Delay(200);
exit(0);
default:
/* Try to lock the specified directory */
newlock = Lock(argv[2],ACCESS_READ);
if (!newlock) CloseAll("Couldn't lock destination directory");
/* Save current directory lock */
/* And change directory */
oldlock = CurrentDir(newlock);
break;
}
signal(SIGINT,BreakHandle);
diskunit=(ULONG)argv[1][0]-'0';
if ((diskunit>3)||(diskunit<0)) {printf("** Unit %d unavailable\n",diskunit);CloseAll(0);}
charunit[2]=diskunit+'0';
if (SysBase->LibNode.lib_Version>36)
{
if(Inhibit(charunit,DOSTRUE)==FALSE) CloseAll("Can't allocate device !");
allocated=1;
}
if (argc<4) numid=0; /* no ID check */
else
{
strncpy(strid,argv[3],8);
switch(strid[0])
{
case '\'':
numid=(((int)(strid[1]))<<24)+(((int)(strid[2]))<<16)+
(((int)(strid[3]))<<8)+((int)(strid[4]));
break;
default: sscanf(strid,"%x",&numid);break;
}
}
if ((ULONG)InitTrackDisk(diskunit)<0) {printf("** Can't open unit %d !",diskunit);CloseAll(0);}
diskinit=1;
if (CheckDiskIn()) {printf("** No disk in unit %d !\n",diskunit);CloseAll(NULL);}
decTrackBuffer=(char *)AllocMem(TRACK_LEN*NB_TRACKS,MEMF_CLEAR);
if (decTrackBuffer==0L) CloseAll("Can't allocate memory.");
rawTrackBuffer=(char *)AllocMem(RAWTRACK_LEN,MEMF_CHIP|MEMF_CLEAR);
if (rawTrackBuffer==0L) CloseAll("Can't allocate chip memory.");
trkptr=decTrackBuffer;
printf("Reading disk data...\n");
for (i=START_TRACK;i<END_TRACK+1;i++)
{
retries=0;
readok=0;
do
{
if (ReadRawTrackIndex(i,rawTrackBuffer))
{
if (retries>2) CloseAll("Low level disk read error!");
}
else
{
dcrslt=DecodeTrack(rawTrackBuffer,trkptr);
if (!dcrslt)
{
if (i==2)
{
/* disk ID check if specified */
readid=(((int)(trkptr[0x10]))<<24)+(((int)(trkptr[1+0x10]))<<16)+
(((int)(trkptr[2+0x10]))<<8)+((int)(trkptr[3+0x10]));
if (numid)
{
if (readid!=numid)
CloseAll("Disk ID does not match");
}
else printf("DiskID : %X\n",readid);
}
readok=1;
trkptr+=TRACK_LEN;
}
else
{
if (retries>2)
switch(dcrslt)
{
case -1: printf("** Error Track %d\n",i);CloseAll("Decode disk read error!");
default: printf("** Error Track %d\n",i);CloseAll("No sync found!");
}
}
}
retries++;
}
while (!readok);
}
switch(WriteFiles(decTrackBuffer))
{
case 0 : printf("Disk read successfuly!\n");CloseAll(NULL);
case -1: CloseAll("File Creation Error");
case -3: CloseAll("Directory Structure Error");
case -5: CloseAll("Memory Allocation Error");
default: CloseAll("Unknown error");
}
}